package com.bbz.core.concurrency.work1;

/**
 * 中断线程Demo
 * 
 * 开启了两个线程分别为sleepThread和BusyThread, sleepThread睡眠1s，BusyThread执行死循环。
 * 然后分别对着两个线程进行中断操作，可以看出sleepThread抛出InterruptedException后清除标志位，
 * 而busyThread就不会清除标志位。
 *	另外，同样可以通过中断的方式实现线程间的简单交互， 
 * while (sleepThread.isInterrupted()) 表示在Main中会持续监测sleepThread，
 * 一旦sleepThread的中断标志位清零，即sleepThread.isInterrupted()返回为false时才会继续Main线程才会继续往下执行。
 * 因此，中断操作可以看做线程间一种简便的交互方式。
 * 一般在结束线程时通过中断标志位或者标志位的方式可以有机会去清理资源，相对于武断而直接的结束线程，这种方式要优雅和安全。 
 * 
 * @author binbin.a.zhang
 *
 */
public class InterruptDemo {
	public static void main(String args[]) {
		// sleepThread睡眠1000ms
		Thread sleepthread = new Thread() {
			@Override
			public void run() {
				try {
					Thread.sleep(1000);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		};
		// busythread 死循环
		Thread busythread = new Thread() {
			@Override
			public void run() {
				while (true)
					;
			}
		};
		//启动两个线程
		sleepthread.start();
		busythread.start();
		//中断线程
		sleepthread.interrupt();
		busythread.interrupt();
		//循环检测sleepThread是否中断，是：true,否：false
		while (sleepthread.isInterrupted()) ;
		System.out.println("sleepThread isInterrupted: " + sleepthread.isInterrupted());
		System.out.println("busyThread isInterrupted: " + busythread.isInterrupted());

	}
}
